

// 定义一个名为__KEY_DEBOUNCE_H_的宏，用于防止头文件被重复包含
#ifndef __KEY_DEBOUNCE_H_
#define __KEY_DEBOUNCE_H_

// 定义一个名为KeyState_t的枚举类型，表示按键的状态
typedef enum {
    KeyState_None,       // 没有按键按下
    KeyState_ShortPress, // 短按
    KeyState_LongPress,  // 长按
    KeyState_Release     // 松开
} KeyState_t;

// 定义一个无符号字符类型
typedef unsigned char uint8_t;

// 定义一个函数指针类型，用于获取IO状态
typedef uint8_t (*fpGetIOSateFunc)(void);

// 定义一个名为KeyInfo_t的结构体，用于存储按键信息
typedef struct {
    uint8_t LongPressTime;   // 按下多久算长按（不包括消抖时间），单位是10ms，如果为0，使用默认值2000ms
    uint8_t ZeroIsPress;     // 按键Key电路的逻辑，若ZeroIsPress==1，代表Key闭合的时候IO的值为0，Key断开时IO的值为1；0则相反
    fpGetIOSateFunc GetIOFunc; // 获取IO状态的函数指针
} KeyInfo_t;

// 定义一个名为Key_t的结构体，用于存储按键的状态当前状态-上一次IO状态 0-0 初始化 0-1 松开 1-0 短按 1-1 长按
typedef struct {
    uint8_t CurrIOState;      // 当前IO状态
    uint8_t LastIOState;      // 上一次IO状态
    uint8_t DebounceCounter;  // 去抖计数器
    KeyState_t State;         // 按键状态
} Key_t;

// 定义一些外部函数声明
extern void Key_Init(void);           // 初始化按键
extern void Key_DebounceService_10ms(void); // 去抖服务（10毫秒）
extern void Key_Scan(void);            // 扫描按键

// 定义两个外部函数声明，用于获取特定按键的状态
extern KeyState_t PluseKey_GetState(void);
extern KeyState_t SmoothieKey_GetState(void);

#endif // __KEY_DEBOUNCE_H_
